package com.example.leetcode.c1_c100.c34;
/**
 * 给定一个按照升序排列的整数数组 nums，和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
 *
 * 如果数组中不存在目标值 target，返回 [-1, -1]。
 *
 * 进阶：
 *
 * 你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗？
 *  
 *
 * 示例 1：
 *
 * 输入：nums = [5,7,7,8,8,10], target = 8
 * 输出：[3,4]
 * 示例 2：
 *
 * 输入：nums = [5,7,7,8,8,10], target = 6
 * 输出：[-1,-1]
 * 示例 3：
 *
 * 输入：nums = [], target = 0
 * 输出：[-1,-1]
 *  
 *
 * 提示：
 *
 * 0 <= nums.length <= 105
 * -109 <= nums[i] <= 109
 * nums 是一个非递减数组
 * -109 <= target <= 109
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */

import java.util.Arrays;

/**
 * 在排序数组中查找元素的第一个和最后一个位置
 * @author zhanpengguo
 * @date 2020-12-01 8:11
 */
public class Solution {

    public int[] searchRange(int[] nums, int target) {
        int len = nums.length;
        int left = 0;
        while (left < len && nums[left] != target) {
            left++;
        }
        if (left == len) {
            return new int[]{-1, -1};
        }
        int right = left + 1;
        while (right < len && nums[right] == target) {
            right++;
        }
        return new int[]{left, right - 1};
    }

    /**
     * 二分查找
     * @param nums
     * @param target
     */
    public int[] searchRange1(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;
        // 二分查找时target所在位置
        int valIdx = -1;
        while (left <= right) {
            int mid = (left + right) / 2;
            if (nums[mid] == target) {
                valIdx = mid;
            }
            if (nums[mid] > target) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        if (valIdx == -1) {
            return new int[]{-1, -1};
        }
        // 向前查找最小位置
        int l = valIdx;
        while (l >= 0 && nums[l] == target) {
            l--;
        }
        // 向后查找最大位置
        int r = valIdx;
        while (r < nums.length && nums[r] == target) {
            r++;
        }
        return new int[]{l + 1, r - 1};
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        int[] nums = {5,7,7,8,8,10};
        int[] ints = solution.searchRange1(nums, 8);
        System.out.println(Arrays.toString(ints));
    }
}
